package structure
{
	import core.sceneManager.sceneSection.ISceneSection;
	
	/**
	 * 场景模块的数据结构
	 * 场景的模块分为要更新的模块和不需要更新的模块，这些模块都存放在数组里面(sections)
	 * sections[i]的类型为Object,Object的属性包括,type,sectionName,autoRefresh,content.
	 */ 
	public class SectionList
	{
	    private var _numAutoRefreshSections: int=0;                 //需要更新的模块的数目
	    private var sections: Array;                              //存储所有的模块，模块节点的内容如下:{type,sectionName,autoRefresh,content};
		public function SectionList(){
			sections=new Array();
		}
		/**
		 * 添加指定的模块。模块的名字唯一，不唯一的话，报错
		 * @param type:模块类型
		 * @param sectionName:模块名称
		 * @param autoRefresh:是否自动更新
		 * @param content:模块的内容
		 */ 
	    public function addSection(typeObj:String, sectionNameObj:String, autoRefreshObj:Boolean, contentObj:ISceneSection): void
	    {
	    	if(!hasSection(typeObj,sectionNameObj))
	    	{
	    		var obj:Object={type:typeObj,sectionName:sectionNameObj,autoRefresh:autoRefreshObj,content:contentObj};
	    		sections.push(obj);
	    		if(obj.autoRefresh)_numAutoRefreshSections++;
	    	}else
	    	{
//	    		throw new Error("模块的名字不能重复！！");
	    	}
	    }
	    /**
	    * 删除所有的模块
	    */ 
	    public function deleteAllSections(): void
	    {
	    	for(var i:int=0;i<sections.length;i++)
	    	{
	    		var section:ISceneSection=ISceneSection(sections[i].content);
	    		section.dispose();
	    		section=null;
	    		sections[i]=null;
	    	}
	    }
	    /**
	    * 删除所有要自动更新的模块
	    */ 
	    public function deleteAutoRefreshSection(): void
	    {
	    	var temp:Array=new Array();
	    	for(var j:int=0;j<sections.length;j++)
	    	{
	    		var obj:Object=sections[j];
	    		if(obj!=null && obj.autoRefresh)
	    		{
	    			obj.content.dispose();
	    			sections[j]=null;
	    		}else
	    		{
	    			temp.push(sections[j]);           //存储不需要更新的模块
	    		}
	    	}
	    	sections=temp;                            //更新数据,这样为空的数据都会被清除掉
	    }
	    /**
	    * 删除指定的模块
	    */
	    public function deleteSection(type:String, sectionName:String):Boolean
	    {
	    	for(var i:int=0;i<sections.length;i++)
	    	{
	    		var obj:Object=sections[i];
	    		if(obj!=null && obj.type==type && obj.sectionName==sectionName)
	    		{
	    			obj.content.dispose();
	    			sections[i]=null;
	    			return true;
	    		}
	    	}
	    	return false;
	    }
	    /**
	    * 删除不需要自动更新的模块
	    */ 
	    public function deleteUnAutoRefreshSection(): void
	    {
	    	var temp:Array=new Array();
	    	for(var j:int=0;j<sections.length;j++)
	    	{
	    		var obj:Object=sections[j];
	    		if(obj!=null && !obj.autoRefresh)            
	    		{
	    			obj.content.dispose();
	    			sections[j]=null;
	    		}else
	    		{
	    			temp.push(sections[j]);
	    		}
	    	}
	    	sections=temp;
	    }
	    /**
	    * 获取所有的模块
	    */ 
	    public function getAllSecions(): Array
	    {
	    	return this.sections;
	    }
	    /**
	    * 获取需要自动更新的模块
	    */ 
	    public function getAutoRefreshSections(): Array
	    {
	    	var temp:Array=new Array();
	    	for(var i:int=0;i<sections.length;i++)
	    	{
	    		var obj:Object=sections[i];
	    		if(obj!=null && obj.autoRefresh) temp.push(temp);
	    	}
	    	return temp;
	    }
	    /**
	    * 获取不需要自动更新的模块
	    */ 
	    public function getUnAutoRefreshSections(): Array
	    {
	    	var temp:Array=new Array();
	    	for(var i:int=0;i<sections.length;i++)
	    	{
	    		var obj:Object=sections[i];
	    		if(obj!=null && !obj.autoRefresh) temp.push(temp);
	    	}
	    	return temp;
	    }
	    //是否存在指定的模块
	    private function hasSection(type:String,sectionName:String):Boolean
	    {
	    	for each(var obj:Object in sections)
	    	{
	    		if(obj!=null && obj.type==type && obj.sectionName)
	    		{
	    			return true;
	    		}
	    	}
	    	return false;
	    }
	    /**
	    * 获取模块的总数
	    */ 
	    public function get numSections():int
	    {
	    	if(sections!=null) return sections.length;
	    	return 0;
	    }
	    /**
	    * 获取不需要更新的模块的数目
	    */ 
	    public function get numAutoRefreshSections():int
	    {
	    	return _numAutoRefreshSections;
	    }
	    /**
	    * 获取不需要更新的模块的数据
	    */ 
	    public function get numUnAutoRefreshSections():int
	    {
	    	if(sections!=null) sections.length-_numAutoRefreshSections;
	    	return 0;
	    }
	    public function dispose():void
	    {
	    	sections=new Array();
	    }
	}
}